require "ISBaseObject"
require "ISUI/ISBackButtonWheel"
require "ISUI/ISInventoryPage"
require "ISUI/ISLayoutManager"
require "ISUI/ISSafetyUI"

ISPlayerDataObject = ISBaseObject:derive("ISPlayerDataObject");

function ISPlayerDataObject:createInventoryInterface()


    local zoom = 2.0;

    local playerObj = getSpecificPlayer(self.id);

    local bind = playerObj:getJoypadBind();
--[[
    if self.id > 0 and bind == -1 then
	    return;
    end
--]]
    local isMouse = self.id == 0 and bind == -1;
    local register = self.id == 0;
    if isMouse then
	    print("player ".. self.id .. " is mouse");
        zoom = 1.34;
    else
        register = false;
    end

zoom = 1.34

    local numPlayers = getNumActivePlayers();
    self:placeInventoryScreens(self.id, numPlayers, isMouse);

    local panel2 = ISInventoryPage:new(self.x1, self.y1, self.w1, self.h1, playerObj:getInventory(), true, zoom);
    panel2.player = self.id;
    panel2:initialise();
    panel2:setUIName("inventory"..self.id)
    panel2:addToUIManager();
    panel2:setController(bind)
    panel2:setInfo(getText("UI_InventoryInfo"));

--    print("createInventoryInterface player="..self.id);
    panel2.player = self.id;
    panel2.transferAll:setVisible(true);
    self.playerInventory = panel2;
    self.playerInventory.player = self.id;
    if not isMouse then
        panel2:setVisible(false);
        panel2.inventoryPane.nameHeader:setWidth((panel2.inventoryPane.width - panel2.inventoryPane.column2) * 2 / 3)
        panel2.inventoryPane:onResizeColumn(panel2.inventoryPane.nameHeader)
    end

    --ISInventoryPage.playerInventory = panel2;
  --  if ISContainerPanelInstance == nil then
    local panel3 = ISInventoryPage:new(self.x2, self.y2, self.w2, self.h2, nil, false, zoom);
    self.lootInventory = panel3;
    self.lootInventory.player = self.id;
    panel3:setUIName("loot"..self.id)
--    print("loot inv created");
    --ISContainerPanelInstance = panel3;
    --   panel2:setNewContainer(self.container);
    panel3.player = self.id;
    panel3:initialise();
    panel3:addToUIManager();
    panel3:setController(bind)
    panel3:setInfo(getText("UI_LootInfo"));
    if not isMouse then
        panel3:setVisible(false);
        panel3.inventoryPane.nameHeader:setWidth((panel3.inventoryPane.width - panel3.inventoryPane.column2) * 2 / 3)
        panel3.inventoryPane:onResizeColumn(panel3.inventoryPane.nameHeader)
    end
    panel3.lootAll:setVisible(true);

    UIManager.setPlayerInventory(self.id, self.playerInventory.javaObject, self.lootInventory.javaObject)

    if isMouse then
        panel2.pin = false;
        panel2.collapseButton:setVisible(false);
        panel2.pinButton:setVisible(true);
        panel2.pinButton:bringToTop();
        panel2.isCollapsed = true;
        panel2:setMaxDrawHeight(15);
        
        panel3.pin = false;
        panel3.collapseButton:setVisible(false);
        panel3.pinButton:setVisible(true);
        panel3.pinButton:bringToTop();
        panel3.isCollapsed = true;
        panel3:setMaxDrawHeight(15);
    else
        panel2:setPinned()
        panel3:setPinned()
    end
    self.buttonPrompt = ISButtonPrompt:new(self.id);
    self.buttonPrompt:initialise();
    self.buttonPrompt:addToUIManager();

--    print("loot all visible");
    self.contextMenu = ISContextMenu:new(0, 0, 1, 1);
--    print("context menu created");
    self.contextMenu:initialise();
--    print("context menu initialised");
    self.contextMenu:addToUIManager();
--    print("context menu added");
    self.contextMenu:setVisible(false);
    self.contextMenu.player = self.id;

    local xoff = 300
    local yoff = 100
    if self.id > 0 then xoff = 70; yoff = 20 end
    self.characterInfo = ISCharacterInfoWindow:new(self.x1left + xoff,self.y1top + yoff,400,400,self.id);
    self.characterInfo:initialise();
    self.characterInfo:addToUIManager();
    self.characterInfo:setVisible(isMouse and (self.characterInfo.visibleOnStartup == true));

    self.equipped = launchEquippedItem(playerObj);

    self.equipped:setX(self.x1left + 10);
    self.equipped:setY(self.y1top + 10);
    -- end
    --panel2 = ISInventoryPage:new(300, 300, 400+32, 400, getPlayer():getInventory());
    --panel2:initialise();
    --panel2:addToUIManager();

    local x = getPlayerScreenLeft(self.id)
    local y = getPlayerScreenTop(self.id)
    local w = getPlayerScreenWidth(self.id)
    local h = getPlayerScreenHeight(self.id)
    self.backButtonWheel = ISBackButtonWheel:new(self.id, (x + w) / 2 - 150, (y + h) / 2 - 150, 300, 300)
    self.backButtonWheel:setVisible(false)
    self.backButtonWheel:setAlwaysOnTop(true)
    self.backButtonWheel:addToUIManager()

    if isClient() then
        local x2, y2 = x + 15, y + self.equipped:getHeight() + 20;
        --if not getServerOptions():getBoolean("SafetySystem") then
        --    x2, y2 = x + w - 200, y + h - 100;
        --end
        self.safetyUI = ISSafetyUI:new(x2, y2, self.id);
        self.safetyUI:initialise();
        self.safetyUI:addToUIManager();
        self.safetyUI:setVisible(true);
        self.equipped:backMost()
    end
    
    if getCore():getGameMode() ~= "Tutorial" then
        self.playerHotbar = ISHotbar:new(playerObj)
        self.playerHotbar:initialise();
        self.playerHotbar:addToUIManager();
        self.playerHotbar:setVisible(isMouse);
    end

    self.craftingUI = ISCraftingUI:new(0, 0, 800, 600, playerObj)
    self.craftingUI:initialise();
    self.craftingUI:addToUIManager();
    self.craftingUI:setVisible(false);
    self.craftingUI:setEnabled(false)

    self.mechanicsUI = ISVehicleMechanics:new(0,0,playerObj,nil);
    self.mechanicsUI:initialise();
--    self.mechanicsUI:addToUIManager();
    self.mechanicsUI:setVisible(false);
    self.mechanicsUI:setEnabled(false);

    self.vehicleDashboard = ISVehicleDashboard:new(self.id, playerObj)
    self.vehicleDashboard:initialise()
    self.vehicleDashboard:instantiate()

    -- Redisplay the dashboard after a splitscreen player is added.
    if playerObj:getVehicle() and playerObj:getVehicle():isDriver(playerObj) then
        self.vehicleDashboard:setVehicle(playerObj:getVehicle())
    end

    if ISMiniMap.IsAllowed() then
        self.miniMap = ISMiniMap.InitPlayer(self.id)
    end

    self.radialMenu = ISRadialMenu:new(0, 0, 100, 200, self.id)
    self.radialMenu:initialise()

    if register then
    ISLayoutManager.RegisterWindow('inventory'..self.id, ISInventoryPage, self.playerInventory) 
    ISLayoutManager.RegisterWindow('loot'..self.id, ISInventoryPage, self.lootInventory)
    ISLayoutManager.RegisterWindow('crafting'..self.id, ISCraftingUI, self.craftingUI)
    ISLayoutManager.RegisterWindow('mechanics'..self.id, ISVehicleMechanics, self.mechanicsUI)
    if self.miniMap then
        ISLayoutManager.RegisterWindow('miniMap'..self.id, ISMiniMapOuter, self.miniMap) 
    end

    if getCore():getGameMode() == "Tutorial" then
        self.characterInfo:setVisible(false);
        self.characterInfo:setX(25)
        self.characterInfo:setY(300)
        self.lootInventory:setVisible(false);
        self.playerInventory:setVisible(false);
    end

    end
end

function ISPlayerDataObject:placeInventoryScreens(playerID, totalPlayers, mouse)
    local x = getPlayerScreenLeft(playerID)
    local y = getPlayerScreenTop(playerID)
    local w = getPlayerScreenWidth(playerID)
    local h = getPlayerScreenHeight(playerID)

    if mouse then

        local divhei = h / 3;

        if w < h then
            divhei = h / 4;
        end

        local divwid = round(w / 3)
        if divwid < 256 + 32 then
            -- min width of ISInventoryPage
            divwid = 256 + 32
        end
        
        self.x1 = x + w / 2 - divwid;
        self.x1left = x;
        self.y1top = y;
        self.y1 = self.y1top;
        self.w1 = divwid;
        self.h1 = divhei;
        self.x2 = self.x1 + divwid;
        self.y2 = self.y1top;
        self.w2 = divwid;
        self.h2 = divhei;

    else
        local ww = w
        local hh = h
        self.x1left = x;
        self.x1 = x;
        self.y1top = y;
        self.y1 = self.y1top + (hh/2);
        self.w1 = (ww / 2);
        self.h1 = (hh / 2);
        self.x2 = self.x1 + self.w1;
        self.y2 = self.y1;
        self.w2 = (ww / 2);
        self.h2 = (hh / 2);

    end


	print("PLAYER DATA OFFSET " .. playerID);
	if playerID > 0 then
		getSpecificPlayer(playerID):setOffSetXUI(self.x1);
		getSpecificPlayer(playerID):setOffSetYUI(self.y1);
	end
    print(self.x1);
    print(self.y1);
    print(self.w1);
    print(self.h1);
end

function ISPlayerDataObject:onResolutionChange(oldw, oldh, neww, newh)
    if JoypadState.players[self.id+1] then
        self:placeInventoryScreens(self.id, getNumActivePlayers(), false)

        self.playerInventory:setWidth(self.w1)
        self.playerInventory:setHeight(self.h1)
        self.playerInventory:setX(self.x1)
        self.playerInventory:setY(self.y1)

        self.lootInventory:setWidth(self.w2)
        self.lootInventory:setHeight(self.h2)
        self.lootInventory:setX(self.x2)
        self.lootInventory:setY(self.y2)

        self.equipped:setX(self.x1left + 10)
        self.equipped:setY(self.y1top + 10)
    end

    local x = getPlayerScreenLeft(self.id)
    local y = getPlayerScreenTop(self.id)
    local w = getPlayerScreenWidth(self.id)
    local h = getPlayerScreenHeight(self.id)

    --if self.safetyUI then
    --    self.safetyUI:setX(x + w - 100)
    --    self.safetyUI:setY(y + h - 100)
    --end

    if self.vehicleDashboard then
        self.vehicleDashboard:onResolutionChange()
    end

    if JoypadState.players[self.id+1] then
        self.characterInfo:setX(x + 70)
        self.characterInfo:setY(y + 20)
    end
end

function ISPlayerDataObject:revertToKeyboardAndMouse()
    self:placeInventoryScreens(0, getNumActivePlayers(), true)

    self.playerInventory:setWidth(self.w1)
    self.playerInventory:setHeight(self.h1)
    self.playerInventory:setX(self.x1)
    self.playerInventory:setY(self.y1)

    self.lootInventory:setWidth(self.w2)
    self.lootInventory:setHeight(self.h2)
    self.lootInventory:setX(self.x2)
    self.lootInventory:setY(self.y2)
end

function ISPlayerDataObject:new (id)
    local o = {}
    --o.data = {}
    setmetatable(o, self)
    self.__index = self

    o.id = id;


    return o
end

ISPlayerDataObject.onKeyPressed = function(key)
    if key == getCore():getKey("Zoom in") then
        screenZoomIn();
    end
    if key == getCore():getKey("Zoom out") then
        screenZoomOut();
    end
end


-- Events.OnKeyPressed.Add(ISPlayerDataObject.onKeyPressed);
